package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.jpa.TblAgencia;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCategoria;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblFlujoAutorizacion;
import com.mastercard.assets.jpa.TblSubcateg;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.struts.forms.AssetBorrarForm;
import com.mastercard.assets.web.struts.forms.AssetEditarForm;
import com.mastercard.assets.web.struts.forms.LoginForm;
import com.mastercard.assets.web.util.to.UserLogin;

public class AssetsEditarPrepararEdicion
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		try
		{
			// convierte el form y toma la clave
			AssetEditarForm f = new AssetEditarForm( ) ;
			
			int cveCategoria = f.getCategoria( ) ;
			String cambioSelect = f.getCambioSelect( ) ;
			
			
//			System.out.println( "Categoria: " + cveCategoria ) ;
//			System.out.println( "Submit: " + cambioSelect ) ;
//			
			// en caso de que la categoria venga mayor de 0 y el venga del cambio de un select
			if( cveCategoria > 0 && cambioSelect != null && cambioSelect.equals( "si" ) )
			{
				
				f.setCambioSelect( "" ) ;

				// calcula subcategorias
				TblCategoria categoria = MasterCardDAO.findCategoryById( cveCategoria ) ;
				
				List< TblSubcateg > subcategs = null ;
				
				// guarda en caso de que no sea null
				if( categoria != null )
					subcategs = categoria.getTblSubcategs( ) ;
				// en caso de que sea null
				else
					subcategs = new ArrayList< TblSubcateg >( ) ;
				
				// en caso de que no haya regas
				if( subcategs == null || subcategs.size( ) == 0 )
				{
	 				// regresa a la pagina
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsEditarDesplegarDatos.jsp" ) ;
					
					request.setAttribute( "AssetAltaForm" , f ) ;
					
					// levanta los flujos de tipo implementacion
					List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
					// levanta los flujos de tipo campania
					List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                        // levanta las agencias
                                        List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                        List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
					
					// en caso de que no haya flujos no hay problema, puesto que el asset se queda asi y en la edicion puede asignarle el flujo
					
					request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
					request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                        request.setAttribute( "Agencias" , agenciaLista ) ;
                                        request.setAttribute( "FlujosAut" , lfa ) ;
					
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotSubcategoryRegsFromCategory" , categoria.getNombre( ) ) ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
				  	return mapping.findForward( "success" ) ;
				}
				
				request.setAttribute( "Subcategorias" , subcategs ) ;
				
				// regresa a la pagina
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsEditarDesplegarDatos.jsp" ) ;
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
				
				// en caso de que no haya flujos no hay problema, puesto que el asset se queda asi y en la edicion puede asignarle el flujo
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				request.setAttribute( "AssetAltaForm" , f ) ;
				
				user.clearMessageError( ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "success" ) ;
				
			}
			
			// en caso de que venga cveCategoria en 0 y venga de cambio de select
			if( cveCategoria == 0 && cambioSelect != null && cambioSelect.equals( "si" ) )
			{
				f.setSubcategoria( 0 ) ;
				
				request.setAttribute( "AssetAltaForm" , f ) ;
				request.setAttribute( "Subcategorias" , new ArrayList< TblSubcateg >( ) ) ;
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
				
				// en caso de que no haya flujos no hay problema, puesto que el asset se queda asi y en la edicion puede asignarle el flujo
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				// regresa a la pagina
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsEditarDesplegarDatos.jsp" ) ;
				
				user.clearMessageError( ) ;
				
				f.setCambioSelect( "" ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "success" ) ;
			}

			// en cao de uqe no haya cambio select
			
			// toma el asset encontrado
			TblAsset asset = ( TblAsset ) request.getAttribute( "ItemFinded" ) ;
			Integer cve = ( Integer ) request.getAttribute( "IdSearched" ) ;
			
			// en caso de que no haya sido encontrado
			if( asset == null ) {
                            MasterCardDAO.closeEntityManager( ) ;
                            return mapping.findForward( "NoItemFinded" ) ;
                        }
				
			
			SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" ) ;
			
			// llena los datos para el form
			f.setCambioSelect( "" ) ;
			f.setCategoria( asset.getTblSubcateg( ).getTblCategoria( ).getCveCategoria( ) ) ;
			f.setCveAsset( asset.getCveAsset( ) ) ;
			f.setDescripcion( asset.getDescripcion( ) ) ;
			f.setDobleLocal( asset.getCostoDobLoc( ) + "" ) ;
			f.setDobleRegional( asset.getCostoDobReg( ) + "" ) ;
			
			if( asset.getFecAprobBc( ) == null )
				f.setAprobacionbcDate( "" ) ;
			else
				f.setAprobacionbcDate( changeDate( sdf.format( asset.getFecAprobBc( ) ) ) ) ;
			
			if( asset.getFecConfSede( ) == null )
				f.setConfirmacionSedeDate( "" ) ;
			else
				f.setConfirmacionSedeDate( changeDate( sdf.format( asset.getFecConfSede( ) ) ) ) ;
			
			if( asset.getFecLimAgenda( ) == null )
				f.setEntregaAgendaDate( "" ) ;
			else
				f.setEntregaAgendaDate( changeDate( sdf.format( asset.getFecLimAgenda( ) ) ) ) ;
			
			if( asset.getFecEntregaBc( ) == null )
				f.setEntregabcDate( "" ) ;
			else
				f.setEntregabcDate( changeDate( sdf.format( asset.getFecEntregaBc( ) ) ) ) ;
			
			if( asset.getFecLimBoletos( ) == null )
				f.setEntregaBoletosDate( "" ) ;
			else
				f.setEntregaBoletosDate( changeDate( sdf.format( asset.getFecLimBoletos( ) ) ) ) ;
			
			if( asset.getFecLimGanadores( ) == null )
				f.setEntregaGanadoresDate( "" ) ;
			else
				f.setEntregaGanadoresDate( changeDate( sdf.format( asset.getFecLimGanadores( ) ) ) ) ;
			
			if( asset.getFecEva( ) == null )
				f.setEvaluacionDate( "" ) ;
			else
				f.setEvaluacionDate( changeDate( sdf.format( asset.getFecEva( ) ) ) ) ;
			
			if( asset.getFecha( ) == null )
				f.setEventDate( "" ) ;
			else
				f.setEventDate( changeDate( sdf.format( asset.getFecha( ) ) ) ) ;
			
			if( asset.getFecFinCamp( ) == null )
				f.setFinCampanaDate( "" ) ;
			else
				f.setFinCampanaDate( changeDate( sdf.format( asset.getFecFinCamp( ) ) ) ) ;
			
			if( asset.getFecRegreso( ) == null )
				f.setRegresoViajeDate( "" ) ;
			else
				f.setRegresoViajeDate( changeDate( sdf.format( asset.getFecRegreso( ) ) ) ) ;
			
			if( asset.getFecLimReqCompra( ) == null )
				f.setRequisicionCompraDate( "" ) ;
			else
				f.setRequisicionCompraDate( changeDate( sdf.format( asset.getFecLimReqCompra( ) ) ) ) ;
			
			if( asset.getFecSalida( ) == null )
				f.setSalidaViajeDate( "" ) ;
			else
				f.setSalidaViajeDate( changeDate( sdf.format( asset.getFecSalida( ) ) ) ) ;
			
			if( asset.getFecLimiteSolCot( ) == null )
				f.setSolicitarCotizacionDate( "" ) ;
			else
				f.setSolicitarCotizacionDate( changeDate( sdf.format( asset.getFecLimiteSolCot( ) ) ) ) ;
			
			if( asset.getFecLimSubeCont( ) == null )
				f.setSubirContratoDate( "" ) ;
			else
				f.setSubirContratoDate( changeDate( sdf.format( asset.getFecLimSubeCont( ) ) ) ) ;
			
			if( asset.getFecLimPrimFact( ) == null )
				f.setSubirPrimeraFacturaDate( "" ) ;
			else
				f.setSubirPrimeraFacturaDate( changeDate( sdf.format( asset.getFecLimPrimFact( ) ) ) ) ;
			
			if( asset.getFecLimSegFact( ) == null )
				f.setSubirSegundaFacturaDate( "" ) ;
			else
				f.setSubirSegundaFacturaDate( changeDate( sdf.format( asset.getFecLimSegFact( ) ) ) ) ;
			
			f.setFechasConfirmadas( ( asset.getFechasConfirmadas( ) == 1 ) ? true : false ) ;
			f.setNombre( asset.getNombre( ) ) ;
			f.setTipoMoneda( asset.getTipoMoneda( ) ) ;
			int tipoHabitacion = asset.getTipoHabitacion( ) ;
			f.setTipoHabitacion( tipoHabitacion ) ;
			f.setNumeroDiasViaje( asset.getNumDiasViaje( ) + "" ) ;
			f.setSencilloLocal( asset.getCostoSenLoc( ) + "" ) ;
			f.setSencilloRegional( asset.getCostoSenReg( ) + "" ) ;
			f.setSubcategoria( asset.getTblSubcateg( ).getCveSubcateg( ) ) ;
                        f.setCveAgencia( asset.getTblAgencia( ).getCveAgencia( ) ) ;
                        f.setCveFlujoDeAutorizacion( asset.getTblFlujoAutorizacion( ).getCveFlujoAut( ) ) ;
			TblFlujo flujo = asset.getTblFlujo1( ) ;
			if( flujo == null )
				f.setFlujoImplEvento( 0 ) ;
			else
				f.setFlujoImplEvento( flujo.getCveFlujo( ) ) ;
			flujo = asset.getTblFlujo2( ) ;
			if( flujo == null )
				f.setFlujoCampEvento( 0 ) ;
			else
				f.setFlujoCampEvento( flujo.getCveFlujo( ) ) ;
			
			// coloca en el request
			request.setAttribute( "AssetEditarForm" , f ) ;
			
			// categoria elegida
			int cveCateg = f.getCategoria( ) ;
			
			// lo necesario para el jsp
			List< TblCategoria > categs = MasterCardDAO.getAllActiveCategorias( ) ;
			
			// en cso de que no haya registros
			if( categs == null )
			{
				categs = new ArrayList< TblCategoria >( ) ;
			}
			
			TblCategoria categoria = null ;
			
			List< TblCategoria > resCateg = new ArrayList< TblCategoria >( ) ;
			List< TblSubcateg > resSubcateg = new ArrayList< TblSubcateg >( ) ;
                        List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                        List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
			
			// quita aquellos uqe no tengan subcategorias
			for( TblCategoria categ : categs )
			{
				// toma las subcateg
				List< TblSubcateg > categSubcateg = categ.getTblSubcategs( ) ;
				
				// en csao de null o 0
				if( categSubcateg != null && categSubcateg.size( ) > 0 )
				{
					// revisa si es la misma categoria
					// en caso de que si
					if( categ.getCveCategoria( ) == cveCateg )
						// guarda las subcategorias
						resSubcateg = categ.getTblSubcategs( ) ;
					
					resCateg.add( categ ) ;
				}
			}
			
			// en cso de que no haya registros
//			if( resCateg.size( ) == 0 )
//			{
//				// en caso de que se cumpla, guarda el WorkArea
//				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
//				
//				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryWithSubcategoriesRegs" ) ) ;
//				
//			  	return mapping.findForward( "success" ) ;
//			}
			
			// en caso de que solamante haya un registro
//			if( resCateg.size( ) == 1 )
//			{
//				List< TblSubcateg > resCategSubcate = resCateg.get( 0 ).getTblSubcategs( ) ;
//				
//				// coloca los regs de las subcategorias
//				request.setAttribute( "Subcategorias" , resCategSubcate ) ;
//				
////				f.setCategoria( resCateg.get( 0 ).getCveCategoria( ) ) ;
//				// en csao de que solamente sea una subcategoria
////				if( resCategSubcate.size( ) == 1 )
////					f.setSubcategoria( resCategSubcate.get( 0 ).getCveSubcateg( ) ) ;
//				
//				request.setAttribute( "AssetAltaForm" , f ) ;
//			}
//			else
//				// coloca los regs de las subcategorias
//				request.setAttribute( "Subcategorias" , new ArrayList< TblSubcateg >( ) ) ;
			
			request.setAttribute( "Subcategorias" , resSubcateg ) ;
                        request.setAttribute( "Agencias" , agenciaLista ) ;
                        request.setAttribute( "FlujosAut" , lfa ) ;
			
			// levanta los flujos de tipo implementacion
			List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
			// levanta los flujos de tipo campania
			List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
			
			// en caso de que no haya flujos no hay problema, puesto que el asset se queda asi y en la edicion puede asignarle el flujo
			
			request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
			request.setAttribute( "FlujosCampania" , flujosCampania ) ;
			
			// levanta las categorias
			request.setAttribute( "Categorias" , resCateg ) ;
			
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			user.setMessageError( e.getMessage( ) ) ;
			request.setAttribute( "Categorias" , new ArrayList< TblCategoria >( ) ) ;
		}
		
		// en caso de que se cumpla, guarda el WorkArea
		user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsEditarDesplegarDatos.jsp" ) ;
		
		MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
	private String changeDate( String date )
	{
		String[ ] tokens = date.split( "-" ) ;
		
		return tokens[ 2 ] + "/" + tokens[ 1 ] + "/" + tokens[ 0 ] ;
	}
}
